﻿// Inner Kit 库
// 用于打印的通用工具类
// 
// Copyright (c) 2025 by 尔西大帝. All rights reserved.
//
// 用于输出流信息
//
// Author: 尔西大帝
// Email: 2670613871@qq.com
// Created: 2025-03-16

#pragma once

#include <string>
#include <DirectXMath.h>

namespace ikit{
  /*
 * 日志功能
 */
// 设置输出流为文件
// is_append = 是否追加。如果为False，会清空原来的文件
void set_log_output_file(const char* filename, bool is_append);
// 输出到输出流，不需要格式化
void print_text(const char* text);
// 输出到输出流
void print(const char* format, ...);
// 输出到输出流
void printv(const char* format, va_list ap);
// 输出到输出流，和kprint唯一的不同就是会在后面增加回车换行。
void log(const char* format, ...);
// 输出错误到输出流
void error(const char* format, ...);
// 输出到输出流，但是拥有一定的时间间隔（目前为一秒，如果以后有需求，再行更新）
void interval_log(const char* format, ...);
// 获得当前的log间隔时间是否合法（执行此项目，如果为TRUE，则会更新时间间隔，不是纯比较）
bool check_log_interal();
// 读取日志文件
std::string get_log();
// 打印制表空格
void print_tab(const char* text = nullptr);
// 步进制表符
void add_tab(int value = 2);
// 退回制表符
void back_tab(int value = 2);
// 重置制表符
void reset_tab();
// 打印矩阵
void print_mat(DirectX::FXMMATRIX mat, bool use_tab = true);
void print_mat(DirectX::XMFLOAT4X4 mat, bool use_tab = true);
// 打印矩阵，将其转化为旋转，平移，缩放的分量
void print_mat_break(DirectX::FXMMATRIX mat, bool use_tab = true);
void print_mat_break(DirectX::XMFLOAT4X4 mat, bool use_tab = true);
// 打印向量
void print_vec3(DirectX::FXMVECTOR vec, bool use_tab = true);
void print_vec3(DirectX::XMFLOAT3 vec, bool use_tab = true);
void print_vec3(float x, float y, float z, bool use_tab = true);
void print_vec4(DirectX::FXMVECTOR vec, bool use_tab = true);
void print_vec4(DirectX::XMFLOAT4 vec, bool use_tab = true);
void print_vec4(float x, float y, float z, float w, bool use_tab = true);
// 将一个四元数转化为欧拉角，然后打印欧拉角
void print_eular(DirectX::FXMVECTOR vec, bool use_tab = true);
// 设置LOG的上限
void set_max_log_line(size_t max_count);
// 打印一个二进制的值
void print_binary_64(uint64_t mask);
void print_binary_32(uint32_t mask);
}

// 为了方便，这些东西不在命名空间中
#if defined(DEBUG) || defined(_DEBUG)
#define KLOG ikit::log
#define KERROR ikit::error
#define KPRINT ikit::print
#else
#define KLOG
#define KERROR
#define KPRINT
#endif
